package q713_numSubarrayProductLessThanK;

public class Solution {
    /*
    利用滑动窗口来解决最长连续乘积子串
     */
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        // 定义ans 和 左指针 以及 当前乘积
        int ans = 0, l = 0, curr = 1;

        for (int r = 0; r < nums.length; r++) {
            // 首先用curr乘以右指针位置
            curr = curr * nums[r];
            // 如果curr < k 则可以将子串加入
            // 对于加入的数量 例如 1 2 3 这段合法 那么当前应该加入的数量是 r - l + 1 对应的是 3 23 123 三个子串
            if (curr < k) {
                ans += r - l + 1;
            }else {
                // 否则就需要移动窗口到子串合法
                while (curr >= k && l <= r) {
                    curr = curr / nums[l];
                    l++;
                }
                // 判断是否为一个合法的子串 如果是例如1 2 3 k = 0 这样的情况 我们每次就会移动到l > r 所以此时是不用加入ans的
                // 如果合法 则将当前子串继续加入ans
                if (l <= r) {
                    ans += r - l + 1;
                }

            }
        }

        return ans;
    }
}
